排程是一種自動化流程,讓我們可以在特定時間執行特定任務。這樣就不需要手動啟動這些任務,節省了時間和精力。在 Linux 系統中,最常用的排程工具是 cron
,用於設定周期性任務。
例如,我們可以排程每天晚上 10 點自動備份文件,或者每週一早上 9 點自動更新系統。
crontab
工具可以用來設定與查看系統的排程作業,除了常用的在每個使用者帳戶自己設定自己的工作外也可以設定系統排程。
使用 crontab
查看目前使用者工作排程:
student$ crontab -l
no crontab for student
查看系統排程
student$ sudo cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
由以上輸出可以得知,系統排程使用 7 個欄位做設定,簡化範例如下:
分 | 時 | 日 | 月 | 星期 | 執行身份 | 指令 |
---|
| 0 | 2 | 1 | * | * | root | /opt/bin/system-check
|
| 0 | 0 | 29 | 2 | * | root | /opt/bin/system-check
|
| 30 | 2 | * | * | 6,7 | sysop | /opt/bin/full-backup
|
每月
1
號02:00
,以root
身份執行/opt/bin/system-check
。
每年2
月29
號00:00
,以root
身份執行/opt/bin/system-check
。
每週六日(6
,7
)02:30
,以sysop
身份執行/opt/bin/full-backup
。
設定系統排程時,一個作業為一行。
多數企業對於作業系統都會有統一的定期作業要執行,比如系統監控、稽核等全域式的作業,此時就很適合使用系統排程來完成。
系統排程的設定檔為 /etc/crontab
,使用文字編輯器開啟後,只要新增在最後一列就可以生效。
以下設定以 root
於每分鐘將 /etc/
目錄輸出到 /tmp/etc.txt
檔案:
使用 vi 編輯 /etc/crontab
student$ sudo vi /etc/crontab
新增設定(在檔案最後面)
~ 以上略 ~
* * * * * root (ls /etc > /tmp/etc.txt)
完成以上設定後,等待 1 分鐘後就會在 /tmp/ 目錄看到相關檔案:
student# ls -lh /tmp/etc.txt
使用者排程以使用者角度設定自己的排程作業,較系統 /etc/crontab
少一 執行身份 欄位。
使用下列範例,以 student
身份每分鐘在將時間輸出到 /tmp/systime.txt
。
student$ crontab -l
student$ ls -l /tmp/systime.txt
FAIL!
student$ crontab -e
* * * * * (date >> /tmp/systime.txt)
等待 1 分鐘後,查看 /tmp/systime.txt
student$ ls -l /tmp/systime.txt
student$ cat /tmp/systime.txt
Sun Oct 23 14:59:01 CST 2022
Sun Oct 23 15:00:01 CST 2022
如果要解除以上排程中的使用者排程,只要重新使用 crontab -e
把先前加入的作業刪除就可以了。
排程記錄可以在 /var/log/cron
檔案中查看,不論成功或失敗都將相關資訊記錄到該檔案裡。
root# last /var/log/cron
Oct 23 14:58:14 localhost crontab[1842]: (root) END EDIT (root)
Oct 23 14:59:01 localhost CROND[1851]: (root) CMD ((date >> /tmp/systme.txt))
Oct 23 15:00:01 localhost CROND[1866]: (root) CMD ((date >> /tmp/systme.txt))
Oct 23 15:00:13 localhost crontab[1870]: (root) LIST (root)
Oct 23 15:01:01 localhost CROND[1875]: (root) CMD (run-parts /etc/cron.hourly)
Oct 23 15:01:01 localhost run-parts[1875]: (/etc/cron.hourly) starting 0anacron
Oct 23 15:01:01 localhost CROND[1884]: (root) CMD ((date >> /tmp/systme.txt))
Oct 23 15:01:01 localhost run-parts[1875]: (/etc/cron.hourly) finished 0anacron
Oct 23 15:02:01 localhost CROND[1891]: (root) CMD ((date >> /tmp/systme.txt))
Oct 23 15:03:01 localhost CROND[1896]: (root) CMD ((date >> /tmp/systme.txt))